package com.tsugun.mediaplayer.presenter.provider;

import com.tsugun.mediaplayer.model.entity.AlbumModel;
import com.tsugun.mediaplayer.model.entity.ArtistModel;
import com.tsugun.mediaplayer.model.entity.DownloadMusicModel;
import com.tsugun.mediaplayer.model.entity.MusicModel;
import com.tsugun.mediaplayer.model.entity.SheetModel;

import java.util.List;

/**
 * listProvider
 * Created by shize on 2017/3/29.
 */

public interface ListProvider {

    /*------------------------------------///获取方法\\\-----------------------------------------*/

    /**
     * @param musicId 歌曲id
     * @return musicModel 该id的歌曲
     */
    MusicModel getMusic(String musicId);

    /**
     * @param title 歌单标题
     * @return 歌单
     */
    SheetModel getSheet(String title);

    /**
     * 获取歌曲总个数
     *
     * @return 歌曲个数
     */
    int getMusicTotal();

    /**
     * @return genres 获取所有音乐类型
     */
    Iterable<String> getGenres();

    /**
     * @return album 获取所有专辑
     */
    Iterable<AlbumModel> getAlbum();

    /**
     * @param artist 歌手名
     * @return album 通过歌手查找专辑
     */
    Iterable<AlbumModel> getAlbumByArtist(String artist);

    /**
     * @return artist 获取所有歌手
     */
    Iterable<ArtistModel> getArtist();

    /**
     * @return folder 获取所有文件夹
     */
    Iterable<String> getFolder();

    /**
     * @return 获取所有歌单信息
     */
    Iterable<SheetModel> getSheet();

    /**
     * @return 获取所有关注的歌手
     */
    Iterable<ArtistModel> getFollow();

    /**
     * @return 获取所有最近播放
     */
    Iterable<MusicModel> getLately();

    /**
     * @return 获取所有下载记录
     */
    Iterable<DownloadMusicModel> getDownload();

    /**
     * @return 喜欢的音乐
     */
    Iterable<MusicModel> getFavoriteMusic();

    /**
     * @return 获取播放列表数据
     */
    Iterable<MusicModel> getPlayList();

    /**
     * @param genre 通过类型获取歌曲
     * @return list 获取该类型的所有歌曲
     */
    Iterable<MusicModel> getMusicByGenre(String genre);

    /**
     * @param folderUrl 文件夹路径
     * @return list 获取该文件夹内的所有歌曲
     */
    Iterable<MusicModel> getMusicByFolder(String folderUrl);

    /**
     * @param album 专辑
     * @return list 获取该专辑的所有歌曲
     */
    Iterable<MusicModel> getMusicByAlbum(String album);

    /**
     * @param artist 歌手
     * @return list 获取该歌手的所有歌曲
     */
    Iterable<MusicModel> getMusicByArtist(String artist);

    /**
     * @param sheetModel 歌单名
     * @return 歌曲集合
     */
    Iterable<MusicModel> getMusicBySheet(SheetModel sheetModel);

    /**
     * @return 从播放列表获取音乐序号
     */
    int getIndexFromPlayList(String musicId);

    /*------------------------------------///操作方法\\\-----------------------------------------*/

    /**
     * @param musicId id 添加喜欢的音乐id
     * @return 是否喜欢
     */
    boolean setFavorite(String musicId);

    /**
     * @param artistName name 添加关注歌手的名称
     * @return 是否关注
     */
    boolean setFollow(String artistName);

    /**
     * @param musicId id 添加最近播放的音乐id
     * @return 是否添加成功
     */
    boolean setLately(String musicId);

    /**
     * @param sheetModel sheet 添加音乐歌单
     * @return id为空则添加失败
     */
    String setSheet(SheetModel sheetModel);

    /**
     * @param downloadMusicModel 音乐下载记录
     * @return 是否添加成功
     */
    boolean setDownLoad(DownloadMusicModel downloadMusicModel);

    /**
     * @param musicId 添加到播放列表的音乐id
     * @return 是否添加成功
     */
    boolean setPlayMusic(String musicId);

    /**
     * 添加音乐到指定列表位置
     *
     * @param musicId id
     * @param index   位置
     */
    void setPlayMusic(String musicId, int index);

    /**
     * @param musicId id 删除的音乐id
     */
    void removeMusic(String musicId);

    /**
     * @param sheetModel 删除的歌单
     */
    void removeSheet(SheetModel sheetModel);

    /**
     * @param musicId id 删除的音乐id
     */
    void removeLately(String musicId);

    /**
     * @param downloadMusicModel 删除的下载记录
     */
    void removeDownload(DownloadMusicModel downloadMusicModel);

    /**
     * @param musicId 从播放列队移除的歌曲id
     */
    void removePlayMusic(String musicId);

    /**
     * 清除所有播放记录
     */
    void clearLately();

    /**
     * 清楚播放列队
     */
    void clearPlayList();

    /**
     * 编辑歌单
     */
    boolean editSheet(SheetModel oldSheet, SheetModel newSheet);

    /**
     * 添加歌曲
     */
    void editSheetAddMusic(SheetModel sheetModel, List<String> musicId);

    /*------------------------------------///搜索方法\\\-----------------------------------------*/
    /*------------------------------所有搜索方法均支持模糊搜索-----------------------------------*/

    /**
     * @return list 搜索所有歌曲
     */
    Iterable<MusicModel> searchAllMusic();

    /**
     * @param title 歌曲文件名
     * @return list 搜索该文件名的所有歌曲
     */
    Iterable<MusicModel> searchMusicBySongTitle(String title);

    /**
     * @param album 专辑
     * @return list 搜索该专辑的所有歌曲
     */
    Iterable<MusicModel> searchMusicByAlbum(String album);

    /**
     * @param artist 歌手
     * @return list 搜索该歌手的所有歌曲
     */
    Iterable<MusicModel> searchMusicByArtist(String artist);

    /**
     * @param name 专辑名
     * @return list 搜索该专辑名的所有专辑
     */
    Iterable<AlbumModel> searchAlbumByName(String name);

    /**
     * @param name 歌手名
     * @return list 搜索该歌手名的所有歌手
     */
    Iterable<ArtistModel> searchArtistByName(String name);

    /*------------------------------------///基本方法\\\-----------------------------------------*/

    /**
     * @param musicId 音乐id
     * @return boolean 检查音乐是否收藏/喜欢
     */
    boolean isFavorite(String musicId);

    /**
     * @param artistName 歌手名
     * @return 是否关注
     */
    boolean isFollow(String artistName);

    /**
     * @return 是否初始化
     */
    boolean isInitialized();

    /**
     * 初始化列表数据
     *
     * @param callback 完成后回调接口
     */
    void retrieveMediaAsync(MusicListProvider.ProviderCallback callback);

    /**
     * 初始化完成回调接口
     */
    public interface ProviderCallback {
        /**
         * @param isInit 是否成功初始化
         */
        void onMusicCatalogReady(boolean isInit);
    }
}
